package com.company.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * 组合对象角色，存储子组件(包含组合对象和叶子对象)
 */
public class Composite extends Component{

    public Composite(String name) {
        super(name);
    }

    /**
     * 组合对象中的子组件对象
     */
    private List<Component> childComponents = null;

    /**
     * 以树形结构方式展示组件名字，递归调用
     */
    @Override
    public void display(String str) {
        // 打印根节点名称
        System.out.println(str + "+" + this.getName());
        // 递归打印子组件名称
        if (null != childComponents) {
            // 向后缩进两个空格
            str += "  ";
            for (Component component : childComponents) {
                // 递归打印每个子组件名称
                component.display(str);
            }
        }
    }

    /**
     * 添加组件对象
     */
    public void addChild(Component child) {
        // 延迟初始化
        if (null == childComponents) {
            childComponents = new ArrayList<Component>();
        }
        childComponents.add(child);
    }

    /**
     * 删除组件对象
     */
    public void removeChild(Component child) {
        if (null != childComponents) {
            childComponents.remove(child);
        }
    }

    /**
     * 根据索引获取组合对象中对应的组件对象
     */
    public Component getChildren(int index) {
        if (null != childComponents) {
            if (index >= 0 && index < childComponents.size()) {
                return childComponents.get(index);
            }
        }
        return null;
    }
}
